RESTful API (Representational State Transfer) হল একটি আর্কিটেকচারাল স্টাইল যা HTTP প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের জন্য ডিজাইন করা হয়। RESTful API ডেভেলপমেন্টে প্রধান ফোকাস হল রিসোর্স মডেল, HTTP মেথড (GET, POST, PUT, DELETE) এবং স্টেটলেস প্রিন্সিপলস। Clojure তে RESTful API তৈরি করার জন্য কিছু জনপ্রিয় টুলস এবং লাইব্রেরি রয়েছে, যেমন Compojure, Ring, Liberator, Pedestal এবং Http-kit।
এখানে, আমরা Ring এবং Compojure ব্যবহার করে Clojure তে একটি RESTful API তৈরি করার প্রক্রিয়া ব্যাখ্যা করব। এই দুটি লাইব্রেরি Clojure-তে HTTP সার্ভার তৈরি এবং API রাউটিংয়ের জন্য খুবই জনপ্রিয় এবং শক্তিশালী টুলস।
Clojure তে RESTful API ডেভেলপ করতে প্রথমে Ring এবং Compojure লাইব্রেরি ইন্সটল করতে হবে।
project.clj ফাইলটি তৈরি করুন এবং নিচের ডিপেনডেন্সি যোগ করুন:
(defproject my-api "0.1.0-SNAPSHOT"
:description "A simple RESTful API in Clojure"
:dependencies [[org.clojure/clojure "1.10.1"]
[ring/ring-core "1.8.2"]
[ring/ring-jetty-adapter "1.8.2"]
[compojure "1.6.2"]
[cheshire "5.10.0"]]) ; JSON parsing
এখানে:
ডিপেনডেন্সি ইনস্টল করতে, আপনার প্রজেক্ট ডিরেক্টরিতে গিয়ে নিচের কমান্ডটি চালান:
lein deps
এখন আমরা একটি GET, POST, PUT, এবং DELETE রিকোয়েস্ট হ্যান্ডল করার জন্য API তৈরি করব।
(ns my-api.core
(:require [compojure.core :refer [defroutes GET POST PUT DELETE]]
[ring.adapter.jetty :refer [run-jetty]]
[cheshire.core :as cheshire]
[ring.util.response :refer [response]]))
; Sample data store (in-memory)
(def users
(atom {:1 {:id 1 :name "Alice" :email "alice@example.com"}
:2 {:id 2 :name "Bob" :email "bob@example.com"}}))
; GET request to fetch user data by ID
(defn get-user [id]
(let [user (@users (keyword id))]
(if user
(response (cheshire/generate-string user))
{:status 404 :body "User not found"})))
; POST request to create a new user
(defn create-user [user-data]
(let [id (str (count @users))]
(swap! users assoc (keyword id) (assoc user-data :id id))
{:status 201 :body (cheshire/generate-string {:message "User created" :id id})}))
; PUT request to update a user
(defn update-user [id user-data]
(if (@users (keyword id))
(do
(swap! users assoc (keyword id) (merge (@users (keyword id)) user-data))
{:status 200 :body (cheshire/generate-string {:message "User updated" :id id})})
{:status 404 :body "User not found"}))
; DELETE request to delete a user
(defn delete-user [id]
(if (@users (keyword id))
(do
(swap! users dissoc (keyword id))
{:status 200 :body (cheshire/generate-string {:message "User deleted" :id id})})
{:status 404 :body "User not found"}))
; Define routes
(defroutes app
(GET "/users/:id" [id] (get-user id))
(POST "/users" {params :params} (create-user params))
(PUT "/users/:id" [id params] (update-user id params))
(DELETE "/users/:id" [id] (delete-user id)))
; Run the server
(defn -main []
(run-jetty app {:port 3000}))
এখানে:
আপনি এখন lein run কমান্ড ব্যবহার করে API চালু করতে পারেন:
lein run
এটি একটি Jetty সার্ভার চালু করবে এবং আপনি http://localhost:3000
এ API অ্যাক্সেস করতে পারবেন।
API টেস্ট করতে, আপনি Postman, curl, অথবা Clojure এর clojure.test ফ্রেমওয়ার্ক ব্যবহার করতে পারেন।
curl http://localhost:3000/users/1
curl -X POST http://localhost:3000/users -d '{"name": "Charlie", "email": "charlie@example.com"}' -H "Content-Type: application/json"
curl -X PUT http://localhost:3000/users/1 -d '{"email": "alice123@example.com"}' -H "Content-Type: application/json"
curl -X DELETE http://localhost:3000/users/2
Clojure তে Ring Middleware ব্যবহার করে API তে Authentication এবং Authorization যুক্ত করা যেতে পারে।
(ns my-api.auth
(:require [ring.util.response :refer [response]]))
(defn check-auth [handler]
(fn [request]
(if (get-in request [:headers "authorization"])
(handler request)
(response "Unauthorized" {:status 401}))))
এটি প্রতিটি রিকোয়েস্টের জন্য Authorization Header চেক করবে।
Clojure-তে সঠিক Error Handling করা গুরুত্বপূর্ণ, যাতে API তে কোনো অপ্রত্যাশিত ত্রুটি ঘটলে তা ব্যবহারকারীকে সঠিকভাবে জানানো যায়।
(defn handle-error [handler]
(fn [request]
(try
(handler request)
(catch Exception e
{:status 500
:body (str "Internal Server Error: " (.getMessage e))}))))
CORS সেটআপের জন্য, API এর সাইটটি অন্য ডোমেইন থেকে অ্যাক্সেস করা গেলে তা নিরাপদভাবে পরিচালনা করতে পারে।
(ns my-api.cors
(:require [ring.middleware.cors :refer [wrap-cors]]))
(def app
(wrap-cors app :access-control-allow-origin [#"http://example.com"]))
এটি শুধুমাত্র http://example.com
থেকে API অ্যাক্সেস অনুমোদন করবে।
RESTful API তৈরি করতে Clojure-তে Ring এবং Compojure দুটি শক্তিশালী টুলস। আমরা এখানে GET, POST, PUT, এবং DELETE রিকোয়েস্ট হ্যান্ডল করতে শিখেছি। এছাড়াও, CORS, Authentication, এবং Error Handling এর মতো বৈশিষ্ট্যগুলি কীভাবে বাস্তবায়ন করা যায় তা আলোচনা করেছি।
Clojure তে RESTful API ডেভেলপমেন্টে Ring, Compojure, এবং Jetty এর মতো শক্তিশালী টুলস ব্যবহার করা সহজ এবং কার্যকরী।
common.read_more